package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)

func SetCookie(ctx *gin.Context) {
	// 设置cookie
	// 键名  值  生命周期  路径  所在域  是否使用https，是否通过http访问
	ctx.SetCookie("name", "tom", 3600, "/", "127.0.0.1", false, true)
	// 如果把生命周期设置为0，表示一个会话，浏览器关闭会自动销毁
	// ctx.SetCookie("name", "小明", 0, "/", "127.0.0.1", false, true)
	ctx.String(200, "cookie设置成功")
}
func GetCookie(ctx *gin.Context) {
	// 获取cookie
	name, err := ctx.Cookie("name")
	if err != nil {
		ctx.String(500, "cookie获取失败")
		return
	}
	ctx.String(200, "获取了用户名：%v", name) //支持使用格式化字符串
}
func DelCookie(ctx *gin.Context) {
	// 删除cookie
	// 生命周期设置为-1
	ctx.SetCookie("name", "", -1, "/", "127.0.0.1", false, true)
	ctx.String(200, "cookie删除成功")
}
func SetSession(ctx *gin.Context) {
	session := sessions.Default(ctx) // 获取默认的session存储引擎
	// 设置session
	session.Set("name", "king")
	// 保存
	session.Save()
	ctx.String(200, "Session设置成功")
}
func GetSession(ctx *gin.Context) {
	// 从默认的存储引擎中获取
	session := sessions.Default(ctx)
	name := session.Get("name")
	ctx.String(200, "从session获取到了用户名：%v", name)
}
func DelSession(ctx *gin.Context) {
	// 从默认的存储引擎中删除
	session := sessions.Default(ctx)
	session.Delete("name") // 删除一个
	// session.Clear()   //清空
	session.Save()
	ctx.String(200, "session删除成功")
}

func main() {
	// 创建路由引擎
	r := gin.Default()
	// 创建基于cookie的存储引擎，用于加密秘钥
	store := cookie.NewStore([]byte("NSD2409"))
	// 注册session中间件，使用cookie存储引擎中的秘钥
	r.Use(sessions.Sessions("sessionid", store))

	r.GET("/set_session", SetSession)
	r.GET("/get_session", GetSession)
	r.GET("/del_session", DelSession)

	r.GET("/set_cookie", SetCookie)
	r.GET("/get_cookie", GetCookie)
	r.GET("/del_cookie", DelCookie)

	r.Run(":8080")
}
